package ar.edu.unrn.lia.bean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.OptimisticLockException;
import javax.persistence.PersistenceException;

import org.primefaces.event.SelectEvent;

import ar.edu.unrn.lia.bean.datamodel.LazyMovimientoDataModel;
import ar.edu.unrn.lia.model.Cuenta;
import ar.edu.unrn.lia.model.Movimiento;
import ar.edu.unrn.lia.service.CuentaService;
import ar.edu.unrn.lia.service.MovimientoService;

@ManagedBean(name = "movimientoBean")
@ViewScoped
public class MovimientoBean extends GenericBean<Movimiento> implements
		Serializable {

	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{movimientoService}")
	MovimientoService entityService;

	@ManagedProperty(value = "#{cuentaService}")
	CuentaService cuentaService;

	public String create() {
		setEntity(new Movimiento());
		return REDIRECT_CREATE;
	}

	public void onRowSelect(SelectEvent event) {
		agregarMensaje(
				FacesMessage.SEVERITY_INFO,
				"Movimiento Seleccionado:",
				"Importe:"
						+ ((Movimiento) event.getObject()).getImporte()
								.toString()
						+ ", Tipo:"
						+ ((Movimiento) event.getObject()).getTipoMovimiento()
								.toString());
	}

	public String update() {
		try {
			if (getEntity().getId() == null) {
				entityService.save(getEntity());
				mensajeFlash("Crear Movimiento",
						"Operación realizada con exito.");
			} else {
				entityService.update(getEntity());
				mensajeFlash("Modificar Movimiento",
						"Operación realizada con exito");
			}

			return REDIRECT_SEARCH;
		} catch (OptimisticLockException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Bloqueo",
					"Alquien modificó este Movimiento, reconsulte.");
			return null;
		} catch (Exception e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage());
			return null;
		}
	}

	public String delete(Movimiento entity) {
		try {
			entityService.delete(entity);
			mensajeFlash("Eliminar Movimiento",
					"Operación realizada con exito.");
			return REDIRECT_SEARCH;
		} catch (OptimisticLockException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Bloqueo",
					"Alquien modificó este Movimiento, reconsulte.");
			return null;
		} catch (PersistenceException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Eliminar Movimiento",
					"No se puede eliminar. El Movimiento esta asociada a una propiedad.");
			return null;
		} catch (Exception e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Eliminar Movimiento",
					e.getMessage());
			return null;
		}
	}

	@PostConstruct
	public void init() {
		setModelLazy(new LazyMovimientoDataModel(entityService));
	}

	public void inicio() {
		if (!FacesContext.getCurrentInstance().isPostback()) {
			if (getId() != null) {
				setEntity(entityService.getEntityById(getId()));
			} else {
				setEntity(new Movimiento());
			}
		}
	}

	public MovimientoService getEntityService() {
		return entityService;
	}

	public void setEntityService(MovimientoService entityService) {
		this.entityService = entityService;
	}

	public CuentaService getCuentaService() {
		return cuentaService;
	}

	public void setCuentaService(CuentaService cuentaService) {
		this.cuentaService = cuentaService;
	}

	public List<Cuenta> cuentas(String query) {
		return getCuentaService().findByQuery(query, "nombre", "desc");
	}

}
